1 package edu.jiangxin.apktoolbox.file.checksum.panel;
2
3 import edu.jiangxin.apktoolbox.swing.extend.EasyChildTabbedPanel;
4 import edu.jiangxin.apktoolbox.swing.extend.filepanel.FilePanel;
5 import edu.jiangxin.apktoolbox.utils.Constants;
6 import org.apache.commons.codec.digest.DigestUtils;
7 import org.apache.commons.lang3.Strings;
8
9 import javax.swing.*;
10 import java.awt.*;
11 import java.io.*;
12
13 public class CompareFilesPanel extends EasyChildTabbedPanel {
14 @Serial
15 private static final long serialVersionUID = 1L;
16
17 private FilePanel firstFilePanel;
18 private FilePanel secondFilePanel;
19
20 private JPanel operationPanel;
21
22 private JTextField resultTextField;
23
24 @Override
25 public void createUI() {
26 BoxLayout boxLayout = new BoxLayout(this, BoxLayout.Y_AXIS);
27 setLayout(boxLayout);
28
29 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
30 createFilePanel();
31 add(firstFilePanel);
32 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
33 add(secondFilePanel);
34
35 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
36 createOperationPanel();
37 add(operationPanel);
38
39 add(Box.createVerticalGlue());
40 }
41
42 private void createFilePanel() {
43 firstFilePanel = new FilePanel("First File");
44 firstFilePanel.initialize();
45 secondFilePanel = new FilePanel("Second File");
46 secondFilePanel.initialize();
47 }
48
49 private void createOperationPanel() {
50 operationPanel = new JPanel();
51
52 JButton compareButton = new JButton("Compare");
53 compareButton.setFocusPainted(false);
54 compareButton.addActionListener(event -> {
55 File firstFile = firstFilePanel.getFile();
56 File secondFile = secondFilePanel.getFile();
57 if (firstFile == null || secondFile == null) {
58 resultTextField.setText("File is not valid");
59 resultTextField.setForeground(Color.YELLOW);
60 return;
61 }
62
63 boolean isChecksumSame = false;
64
65 try (FileInputStream firstFis = new FileInputStream(firstFile);
66 FileInputStream secondFis = new FileInputStream(secondFile)) {
67 String firstSha512 = DigestUtils.sha512Hex(firstFis);
68 String secondSha512 = DigestUtils.sha512Hex(secondFis);
69 isChecksumSame = Strings.CI.equals(firstSha512, secondSha512);
70 } catch (FileNotFoundException e) {
71 logger.error("calculate, FileNotFoundException");
72 } catch (IOException e) {
73 logger.error("calculate, IOException");
74 }
75
76 if (isChecksumSame) {
77 resultTextField.setText("File is same");
78 resultTextField.setForeground(Color.GREEN);
79 return;
80 }
81
82 resultTextField.setText("File is different");
83 resultTextField.setForeground(Color.RED);
84 });
85
86 resultTextField = new JTextField("To be comparing");
87 resultTextField.setPreferredSize(new Dimension(100, 25));
88 resultTextField.setEditable(false);
89 resultTextField.setBorder(null);
90 Font font = new Font(null, Font.BOLD, 16);
91 resultTextField.setFont(font);
92 resultTextField.setForeground(Color.YELLOW);
93
94 operationPanel.setLayout(new BoxLayout(operationPanel, BoxLayout.X_AXIS));
95 operationPanel.add(compareButton);
96 operationPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
97 operationPanel.add(resultTextField);
98 operationPanel.add(Box.createHorizontalGlue());
99 }
100 }